/* ***
  **********************************************
  Algoritmo de Black-Scholes - Sequencial
  **********************************************
*** */

/***************
BIBLIOTECAS
***************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


/***************
FUNCOES
***************/
// referencia: http://c-faq.com/lib/gaussian.html
double gaussrand()
{
	static double V1, V2, S;
	static int phase = 0;
	double X;

	if(phase == 0) {
		do {
			double U1 = (double)rand() / RAND_MAX;
			double U2 = (double)rand() / RAND_MAX;

			V1 = 2 * U1 - 1;
			V2 = 2 * U2 - 1;
			S = V1 * V1 + V2 * V2;
			} while(S >= 1 || S == 0);

		X = V1 * sqrt(-2 * log(S) / S);
	} else
		X = V2 * sqrt(-2 * log(S) / S);

	phase = 1 - phase;

	return X;
}

/***************
PRINCIPAL
***************/
int main(void){
	//Variáveis de Entrada
	double valoAcao, precoOpcao, taxaJuros, volAcao, tempoOpcao;
	int numIteracoes;
	
	//Variaveis auxiliares
	int i;
	double t, maximo, media, desvioPadrao, intervaloConfianca, minConf, maxConf;

	scanf("%lf %lf %lf %lf %lf %d", &valoAcao, &precoOpcao, &taxaJuros, &volAcao, &tempoOpcao, &numIteracoes);
	
	double vetor[numIteracoes];

	
	//Algoritmo de Black Scholes com Monte Carlo
	for(i = 0; i < numIteracoes; i++){
		t = exp(((taxaJuros - (0.5 * (volAcao * volAcao))) * tempoOpcao) + (volAcao * sqrt((float)tempoOpcao) * (gaussrand())));
		t  = valoAcao * t;
		
		maximo = t - precoOpcao;
		if(maximo <= 0)
			maximo = 0;
		
		vetor[i] = exp((-taxaJuros) * tempoOpcao) * maximo;
	}
	
	//Calcula a media do vetor
	media  = 0.0;
	for(i = 0; i < numIteracoes; i++){
		media = media + vetor[i];
	}
	media = media/(double)numIteracoes;
	
	//Calculando o desvio padrão
	for(i = 0; i < numIteracoes; i++){
		vetor[i] = vetor[i] - media;
	}
	
	desvioPadrao = 0.0;
	for(i = 0; i < numIteracoes; i++){
		desvioPadrao = desvioPadrao + (vetor[i] *vetor[i]);
	}
	desvioPadrao = desvioPadrao/(double)numIteracoes;
	desvioPadrao = sqrt(desvioPadrao);
	
	//Calculando o intervalo de Confiança
	intervaloConfianca = (1.96 * desvioPadrao)/ sqrt((float)numIteracoes);
	
	minConf = media - intervaloConfianca;
	maxConf = media + intervaloConfianca;

	printf("S\t%.0lf\n", valoAcao);
	printf("E\t%.0lf\n", precoOpcao);
	printf("r\t%.0lf\n", taxaJuros);
	printf("sigma\t%.0lf\n", volAcao);
	printf("T\t%.0lf\n", tempoOpcao);
	printf("M\t%d\n", numIteracoes);
	printf("Confidence interval: (%.4lf, %.4lf)\n", minConf, maxConf);
	
	return 0;
}
